package com.itbaizhan;

import java.sql.Connection;
import java.sql.PreparedStatement;

/**PreparedStatement的使用*/
/*PreparedStatement对象简介
继承自 Statement 接口，由 preparedStatement方法创建。
PreparedStatement具有预编译SQL语句能力，
所以PreparedStatement 对象比 Statement 对象的效率更高，
由于实现了动态的参数绑定，所以可以防止 SQL 注入，
所以我们一般都使用 PreparedStatement。

PreparedStatement对象的特点：
PreparedStatement 接口继承 Statement 接口
PreparedStatement 效率高于 Statement
PreparedStatement 支持动态绑定参数
PreparedStatement 具备 SQL 语句预编译能力
使用 PreparedStatement 可防止出现 SQL 注入问题

PreparedStatement 的预编译能力
语句的执行步骤
语法和语义解析
优化 sql 语句，制定执行计划
执行并返回结果
但是很多情况，我们的一条 sql 语句可能会反复执行，或者每次执行的时候只有个别的值
不同（比如 select 的 where 子句值不同，update 的 set 子句
值不同,insert 的 values 值不同）。 如果每次都需要经过上面的
词法语义解析、语句优化、制定执行计划等，则效率就明显不行 了。
所谓预编译语句就是将这类语句中的值用占位符替代，
可以视为将 sql 语句模板化或者说参数化预编译语句的优势在于：
一次编译、多次运行，省去了解析优化等过程；此外预编译语
句能防止 sql 注入*/
public class TestPreparedStatement {
    /*添加数据*/
    public void insertUsers(String username,int userage){
        Connection connection = null;
        PreparedStatement ps = null;
        try{
            //获取数据连接对象
            connection = JdbcUtils.getConnection();
            //定义sql  列是字符类型也不用加"" ,
            // ? 是PreparedStatement对象中的绑定参数的占位符，问号 位置是从1开始计数
            String sql = "insert into users values(default,?,?)";
            //获取PreparedStatement
            ps = connection.prepareStatement(sql);
            //完成参数的绑定
            ps.setString(1,username);
            ps.setInt(2,userage);
            int i = ps.executeUpdate();
            System.out.println(i);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.closeResource(ps,connection);
        }
    }

    /*更改数据*/
    public void updateUsersById(int userid,String username,int userage){
        Connection connection = null;
        PreparedStatement ps = null;
        try{
            connection = JdbcUtils.getConnection();
            //创建PreparedStatement对象
            ps = connection.prepareStatement("update users set username =?,userage = ? where userid = ?");
            ps.setString(1,username);
            ps.setInt(2,userage);
            ps.setInt(3,userid);
            int i = ps.executeUpdate();
            System.out.println(i);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.closeResource(ps,connection);
        }
    }

    /*根据id删除数据*/
    public void deleteUsers(int userid){
        Connection connection = null;
        PreparedStatement ps = null;
        try{
            //获得Connection对象
            connection = JdbcUtils.getConnection();
            //PreparedStatement对象
            ps = connection.prepareStatement("delete from users where userid = ?");
            ps.setInt(1,userid);
            int i = ps.executeUpdate();
            System.out.println(i);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.closeResource(ps,connection);
        }
    }
}
